package com.dengqi.mymodule.activity.asynctask;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 第一个泛型 ： 表示传入的原始参数类型
 * 第二个泛型 ： 表示后台任务中间执行进度的数据类型，比如可以用在下载中
 * 第三个泛型 ： 表示最终返回结果的数据类型
 * 若是没有参数：那么在相应位置可以写 Void
 */
public class DownloadTask extends AsyncTask<String, Integer, Bitmap> {

    private WeakReference<TaskListener> taskListener;

    DownloadTask(TaskListener taskListener) {
        this.taskListener = new WeakReference<>(taskListener);
    }

    /**
     * 相关的准备任务，运行在 UI 线程
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        if (taskListener.get() != null) {
            taskListener.get().onPreExecute();
        }
    }

    /**
     * 代理 异步任务，运行在独立的线程中，期中可以使用publishProgress(int) 方法更新任务进度
     */
    @Override
    protected Bitmap doInBackground(String... strings) {
        //    通过Apache的HttpClient来访问请求网络中的一张图片
        HttpURLConnection connection;
        Bitmap bitmap = null;
        try {
            URL url = new URL(strings[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.setUseCaches(false);
            InputStream inputStream = connection.getInputStream();
            //方法一
//                bitmap = BitmapFactory.decodeStream(inputStream);
            //方法二
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            // 得到文件的总长度
            int file_length = connection.getContentLength();
            // 每次读取后累加的长度
            int total_length = 0;
            int length = 0;
            byte[] buffer = new byte[1024];
            while ((length = inputStream.read(buffer)) != -1) {
                // 每读一次，就将total_length累加起来
                total_length += length;
                // 边读边写到ByteArrayOutputStream当中
                byteArrayOutputStream.write(buffer, 0, length);
                // 得到当前图片下载的进度
                int progress = (int) ((total_length / (float) file_length) * 100);
                // 时刻将当前进度更新给onProgressUpdate方法
                publishProgress(progress);
            }
            bitmap = BitmapFactory.decodeByteArray(byteArrayOutputStream.toByteArray(), 0, file_length);
            inputStream.close();
            byteArrayOutputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }


    /**
     * 用于更新进度，运行在 UI 线程
     */
    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
        if (taskListener.get() != null) {
            taskListener.get().onProgressUpdate(values[0]);
        }
    }

    /**
     * 获取最终结果，运行在 UI 线程
     */
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        if (taskListener.get() != null) {
            taskListener.get().onPostExecute(bitmap);
        }
    }
}
